// 用户路由表

// 加载模块
const express = require('express');
const sendMail = require('../utils/email');
const usersModel = require('../db/models/usersModel');
// 可以在当前路由表中使用usersModel来操作users数据集合
const jwt = require('jsonwebtoken');

// 创建一张路由表（空表）
const router = express.Router();

// 向路由表添加内容:

// 判断是否登录接口
router.get('/islogin',(req,res)=>{
    // 验证token
    let token = req.headers.authorization;
    jwt.verify(token,'hehehaha',(err,payload)=>{
        if (err) {
            res.send({"code":0,"msg":"token验证失败"});
        } else {
            res.send({"code":1,"msg":"token验证成功","info":payload});
        }
    })
})

// 登录接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/login
// 3.请求参数：username账号  password密码
// 4.响应结果：{"code":1,"msg":"登录成功"}
router.post('/login',(req,res)=>{
    // 获取post请求参数
    let {username,password} = req.body;
    
    // 查询数据库
    usersModel.find({$and:[{username},{password}]})
    .then((arr)=>{
        if (arr.length > 0) {
            // 获取session data
            // console.log( req.session );// session {...}
            
            // 登录成功，向session data中存储数据
            // req.session.login = 'is login';// 已登陆的标识
            // req.session.username = username;// 用户信息

            // 登录成功，生成token， 并保存用户信息
            let info = {
                "username":arr[0].username,
                "email":arr[0].email
            }
            let token = jwt.sign(info,'hehehaha',{expiresIn:60*30});

            // 响应请求
            res.send({"code":1,"msg":"登录成功",token});
            
            // 重定向（跳转到百度首页）
            // res.status(301);
            // res.redirect('https://www.baidu.com/');
        } else {
            // 登录失败
            res.send({"code":0,"msg":"账号或密码错误"});
        }
    })
    .catch((err)=>{
        // 出错了
        res.send({"code":-1,"msg":err});
    })

    // res.send('login is ok');
})

// 缓存验证码
let cachedCode = {
    // '12345678@qq.com': '23487',
    // '87654321@qq.com': '37374'
}

// 注册接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/register
// 3.请求参数：username账号  password密码  phone手机号  email邮箱  age年龄  sex性别  code验证码
// 4.响应结果：{"code":1,"msg":"注册成功"}
router.post('/register',(req,res)=>{
    // 获取post请求参数
    let {username,password,phone,email,age,sex,code} = req.body;

    // 校验验证码
    if (cachedCode[email] !== code) {
        return res.send({"code":-9,"msg":"验证码错误！"});
    }

    // 校验数据格式
    let reg1 = /^\w{6,18}$/;
    if (!reg1.test(username)) {
        return res.send({"code":-1,"msg":"账号格式不符合要求！"});
    }
    let reg2 = /^\w{6,18}$/;
    if (!reg2.test(password)) {
        return res.send({"code":-2,"msg":"密码格式不符合要求！"});
    }
    let reg3 = /^1[3-9]\d{9}$/;
    if (!reg3.test(phone)) {
        return res.send({"code":-3,"msg":"手机号格式不符合要求！"});
    }
    let reg4 = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
    if (!reg4.test(email)) {
        return res.send({"code":-4,"msg":"邮箱格式不符合要求！"});
    }
    let reg5 = /^\d{1,3}$/;
    if (!reg5.test(age)) {
        return res.send({"code":-5,"msg":"年龄格式不符合要求！"});
    }
    let reg6 = /^[男女妖]$/;
    if (!reg6.test(sex)) {
        return res.send({"code":-6,"msg":"性别格式不符合要求！"});
    }

    // 查询数据库
    usersModel.find({username})
    .then((arr)=>{
        if (arr.length > 0) {
            // 账号已被注册
            res.send({"code":0,"msg":"账号已存在！"});
            // 终止链式调用
            return new Promise(()=>{});
        } else {
            // 可以注册，添加一条数据
            return usersModel.insertMany({username,password,phone,email,age,sex})
        }
    })
    .then((arr)=>{
        if (arr.length > 0) {
            res.send({"code":1,"msg":"注册成功！"});
        } else {
            res.send({"code":-7,"msg":"注册失败！"});
        }
    })
    .catch((err)=>{
        res.send({"code":-8,"msg":err});
    })

    // res.send('register is ok');
})

// 邮箱验证码接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/sendmail
// 3.请求参数：email邮箱  2239222721@qq.com
// 4.响应结果：{"code":1,"msg":"邮件发送成功"}
router.post('/sendmail',(req,res)=>{
    // 获取post请求参数
    let {email} = req.body;

    // 生成随机验证码
    let code = parseInt( Math.random() * 100000 );

    // 缓存验证码
    cachedCode[email] = code+'';

    // 发送邮件
    sendMail(email,'注册验证码','您的注册验证码为：'+code)
    .then(()=>{
        res.send({"code":1,"msg":"邮件发送成功"});
    })
    .catch(()=>{
        res.send({"code":0,"msg":"邮件发送失败"});
    })

    // res.send('sendmail is ok');
})

// 用户列表接口（提供数据）
router.get('/userList',(req,res)=>{
    // 查询所有用户
    usersModel.find()
    .then((arr)=>{
        res.send(arr);
    })
    .catch((err)=>{
        res.send({"err":1,"msg":"获取数据失败"});
    })
})

// 模块输出路由表
module.exports = router;
